package com.baozhun.mall.common.base

import android.view.Gravity
import androidx.multidex.MultiDex
import cat.ereza.customactivityoncrash.config.CaocConfig
import cn.jiguang.api.utils.JCollectionAuth
import cn.jpush.android.api.JPushInterface
import com.alibaba.android.arouter.launcher.ARouter
import com.baozhun.mall.common.BuildConfig
import com.baozhun.mall.common.activity.ErrorActivity
import com.baozhun.mall.common.event.AppViewModel
import com.baozhun.mall.common.event.EventViewModel
import com.baozhun.mall.common.util.CacheUtil
import com.baozhun.mall.common.util.SimpleImageLoader
import com.baozhun.mall.common.util.config.SDKConfig
import com.baozhun.mall.common.util.config.UmInitConfig
import com.baozhun.mall.common.widget.loadCallBack.EmptyCallback
import com.baozhun.mall.common.widget.loadCallBack.ErrorCallback
import com.baozhun.mall.common.widget.loadCallBack.LoadingCallback
import com.baozhun.mall.common.widget.loading.CustomLoadMoreView
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.ProcessUtils
import com.blankj.utilcode.util.ToastUtils
import com.chad.library.adapter.base.module.LoadMoreModuleConfig
import com.kingja.loadsir.callback.SuccessCallback
import com.kingja.loadsir.core.LoadSir
import com.orhanobut.logger.AndroidLogAdapter
import com.orhanobut.logger.FormatStrategy
import com.orhanobut.logger.Logger
import com.orhanobut.logger.PrettyFormatStrategy
import com.previewlibrary.ZoomMediaLoader
import com.rich.oauth.callback.InitCallback
import com.rich.oauth.core.RichAuth
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.ClassicsHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.tencent.mmkv.MMKV
import com.tencent.sonic.sdk.SonicConfig
import com.tencent.sonic.sdk.SonicEngine
import com.tencent.tauth.Tencent
import com.umeng.analytics.MobclickAgent
import com.umeng.commonsdk.UMConfigure
import com.zzhoujay.richtext.RichText
import me.hgj.jetpackmvvm.base.BaseApp
import me.hgj.jetpackmvvm.ext.util.jetpackMvvmLog
import me.jessyan.autosize.utils.AutoSizeLog.isDebug
import kotlin.system.exitProcess


/**
 * 作者　: hegaojian
 * 时间　: 2019/12/23
 * 描述　:
 */

//Application全局的ViewModel，里面存放了一些账户信息，基本配置信息等
val mAppViewModel: AppViewModel by lazy { BaseApplication.mAppViewModelInstance }

//Application全局的ViewModel，用于发送全局通知操作
val mEventViewModel: EventViewModel by lazy { BaseApplication.mEventViewModelInstance }

class BaseApplication : BaseApp() {

    companion object {
        lateinit var mInstance: BaseApplication
        lateinit var mEventViewModelInstance: EventViewModel
        lateinit var mAppViewModelInstance: AppViewModel

        init {
            initRefresh()
        }

        /**
         * 设置刷新的全局属性
         */
        private fun initRefresh() {
            //设置全局的Header构建器
            SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, _ ->
                ClassicsHeader(context)
//                HouJiRefreshHeader(context)
            }
            //设置全局的Footer构建器
            SmartRefreshLayout.setDefaultRefreshFooterCreator { context, _ ->
                ClassicsFooter(context).setDrawableSize(
                    20f
                )
            }
//            ClassicsHeader.REFRESH_HEADER_PULLING = "下拉刷新"
            // 在 Application 中配置全局自定义的 LoadMoreView
            LoadMoreModuleConfig.defLoadMoreView = CustomLoadMoreView()
        }
    }

    override fun onCreate() {
        super.onCreate()
        mInstance = this
        jetpackMvvmLog = BuildConfig.DEBUG
        initMMKV()
        initRichText()
        initToast()
        preInitSdk()
        initGlobalViewModel()
        initMultiDex()
        initLoadSir()
        initCrashCatch()
        initARouter()
        initLogger()
        initImagePreview()

    }

    /**
     * 设置RichText缓存目录
     */
    private fun initRichText() {
        RichText.initCacheDir(this)
    }


    /**
     * 需要预初始化的sdk
     */
    private fun preInitSdk() {
        //友盟预初始化
        UMConfigure.preInit(applicationContext, SDKConfig.UMENG_APP_ID, "Umeng")
        UMConfigure.setLogEnabled(BuildConfig.DEBUG)
        //极光预初始化
        JCollectionAuth.setAuth(this, false)
    }


    /**
     * 同意隐私协议后需要初始化的sdk
     */
    fun agreePrivacyProtocolInit() {
        initUMeng()
        initJPush()
        initTxOneKeyLogin()
    }

    /**
     * 友盟正式初始化
     */
    private fun initUMeng() {
        if (!CacheUtil.isAgreePrivacyProtocol()) return
        //友盟正式初始化
        val umInitConfig = UmInitConfig()
        umInitConfig.UMinit(applicationContext)
        //QQ官方sdk授权
        Tencent.setIsPermissionGranted(true)

    }

    /**
     * 初始化图片预览库
     */
    private fun initImagePreview() {
        ZoomMediaLoader.getInstance().init(SimpleImageLoader())
    }

    /**
     * 初始化ARouter
     */
    private fun initARouter() {
        if (isDebug()) {           // 这两行必须写在init之前，否则这些配置在init过程中将无效
            ARouter.openLog()     // 打印日志
            ARouter.openDebug()   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(this) // 尽可能早，推荐在Application中初始化
    }

    /**
     * 初始化全局viewModel
     */
    private fun initGlobalViewModel() {
        mEventViewModelInstance = getAppViewModelProvider().get(EventViewModel::class.java)
        mAppViewModelInstance = getAppViewModelProvider().get(AppViewModel::class.java)
    }

    /**
     * 初始化多dex配置
     */
    private fun initMultiDex() {
        MultiDex.install(this)
    }

    /**
     * 初始化防崩溃配置
     */
    private fun initCrashCatch() {
        //防止项目崩溃，崩溃后打开错误界面
        CaocConfig.Builder.create()
            .backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT) //default: CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM
            .enabled(true)//是否启用CustomActivityOnCrash崩溃拦截机制 必须启用！不然集成这个库干啥？？？
            .showErrorDetails(false) //是否必须显示包含错误详细信息的按钮 default: true
            .showRestartButton(false) //是否必须显示“重新启动应用程序”按钮或“关闭应用程序”按钮default: true
            .logErrorOnRestart(false) //是否必须重新堆栈堆栈跟踪 default: true
            .trackActivities(true) //是否必须跟踪用户访问的活动及其生命周期调用 default: false
            .minTimeBetweenCrashesMs(2000) //应用程序崩溃之间必须经过的时间 default: 3000
//            .restartActivity(WelcomeActivity::class.java) // 重启的activity
            .errorActivity(ErrorActivity::class.java) //发生错误跳转的activity
            .apply()
    }

    /**
     * init mmkv
     */
    private fun initMMKV() {
        MMKV.initialize(this)
    }

    /**
     * 界面加载管理工具 初始化
     */
    private fun initLoadSir() {
        LoadSir.beginBuilder()
            .addCallback(LoadingCallback())//加载
            .addCallback(ErrorCallback())//错误
            .addCallback(EmptyCallback())//空
            .setDefaultCallback(SuccessCallback::class.java)//设置默认加载状态页
            .commit()
    }

    /**
     * 初始化initLogger
     */
    private fun initLogger() {
        val formatStrategy: FormatStrategy = PrettyFormatStrategy.newBuilder()
            .showThreadInfo(false) // Whether to show thread info or not. Default true
            .methodCount(3) // How many method line to show. Default 2
            .methodOffset(5) // Hides internal method calls up to offset. Default 5
            .tag("roots") // Global tag for every log. Default PRETTY_LOGGER
            .build()
        Logger.addLogAdapter(object : AndroidLogAdapter(formatStrategy) {
            override fun isLoggable(priority: Int, tag: String?): Boolean {
                return BuildConfig.DEBUG
            }
        })
    }

    /**
     * 初始化腾讯一键登陆
     */
    private fun initTxOneKeyLogin() {
        if (!ProcessUtils.isMainProcess()) return
        RichAuth.getInstance().init(this, SDKConfig.ONE_KEY_LOGIN_APP_ID, object : InitCallback {
            override fun onInitSuccess() {
                Logger.e("initTxOneKeyLogin success")
            }

            override fun onInitFailure(errorMsg: String) {
                Logger.e("initTxOneKeyLogin success")
            }
        })
    }

    /**
     * 初始化极光推送sdk
     */
    private fun initJPush() {
        if (CacheUtil.isAgreePrivacyProtocol()) {
            JPushInterface.setDebugMode(BuildConfig.DEBUG)
            //关闭SDK自启动
            JCollectionAuth.enableAutoWakeup(this, false)
            JPushInterface.init(this)
            JCollectionAuth.setAuth(this, true)
        } else {
            JCollectionAuth.setAuth(this, false)
        }

    }

    /**
     * 初始化toast设置
     */
    private fun initToast() {
        ToastUtils.getDefaultMaker().setGravity(Gravity.CENTER, 0, 0)
    }

    /**
     * 退出app
     */
    fun exitApp() {
        ActivityUtils.finishAllActivities()
        MobclickAgent.onKillProcess(this)
        exitProcess(0)
        RichText.recycle()
    }
}
